package com.lipuwater.agent.ble.utils;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑
 * 　　　　┃　　　┃永无BUG！
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━神兽出没━━━━━━
 * Created by  Administrator  on 2016/12/19.
 * Email:924686754@qq.com
 */
public class ByteUtils {

    /**
     * 10进制字节转16进制字符串
     *
     * @param bytes
     * @return
     */
    public static String toHexString(byte bytes) {
        String str = "";
        String result = Integer.toHexString(bytes & 0xFF);
        str += result.length() == 1 ? '0' + result : result;
        return str;
    }

    /**
     * 10进制字节数组转16进制字符串
     *
     * @param bytes
     * @return
     */
    public static String toHexString(byte[] bytes) {
        if (bytes == null) {
            return "";
        }
        String str = "";
        for (int i = 0; i < bytes.length; i++) {
            String result = Integer.toHexString(bytes[i] & 0xFF);
            str += result.length() == 1 ? '0' + result : result;
        }
        return str;
    }

    public static String toHexString(List<Byte> bytes) {
        String str = "";
        for (int i = 0; i < bytes.size(); i++) {
            String result = Integer.toHexString(bytes.get(i) & 0xFF);
            str += result.length() == 1 ? '0' + result : result;
        }
        return str;
    }

    /**
     * 字节转10进制
     */
    public static int byteTo10(byte bytes) {
        String hex = toHexString(bytes);
        return Integer.parseInt(hex, 16);
    }

    /**
     * 十六进制字符串转字节数组
     *
     * @param hexString
     * @return
     */
    public static byte[] toByteArray(String hexString) {
        if (hexString.equals("")) {
            return null;
        }
        hexString = hexString.toLowerCase();
        final byte[] byteArray = new byte[hexString.length() / 2];
        int k = 0;
        for (int i = 0; i < byteArray.length; i++) {
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
            byteArray[i] = (byte) (high << 4 | low);
            k += 2;
        }
        return byteArray;
    }

    /**
     * 十六进制字符串转字节List
     *
     * @param hexString
     * @return
     */
    public static List<Byte> toByteList(String hexString) {
        if (hexString.equals("")) {
            return null;
        }
        hexString = hexString.toLowerCase();
        final int count = hexString.length() / 2;
        List<Byte> byteArray = new ArrayList<Byte>();
        int k = 0;
        for (int i = 0; i < count; i++) {
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
            byteArray.add((byte) (high << 4 | low));
            k += 2;
        }
        return byteArray;
    }

    /**
     * 字节转bit
     *
     * @param by  01010110
     * @return
     */
    public static String getBit(byte by) {
        StringBuffer sb = new StringBuffer();
        sb.append((by >> 7) & 0x1).append((by >> 6) & 0x1)
                .append((by >> 5) & 0x1).append((by >> 4) & 0x1)
                .append((by >> 3) & 0x1).append((by >> 2) & 0x1)
                .append((by >> 1) & 0x1).append((by >> 0) & 0x1);
        return sb.toString();
    }

    /**
     * 合并数组
     *
     * @param a
     * @param b
     * @return
     */
    public static byte[] concat(byte[] a, byte[] b) {
        final int alen = a.length;
        final int blen = b.length;
        if (alen == 0) {
            return b;
        }
        if (blen == 0) {
            return a;
        }
        final byte[] result = (byte[]) Array.newInstance(a.getClass().getComponentType(), alen + blen);
        System.arraycopy(a, 0, result, 0, alen);
        System.arraycopy(b, 0, result, alen, blen);
        return result;
    }
}
